-- Copyright (c) 2015,2016 Lucky Byte, Inc.
--
-- Summary : 处理银联后台通知
--
-- Author  : 吴小虎 <xiaohu@lucky-byte.com>
-- Since   : 2016.5.20
--
-- History
--  * 2016.5.20 : 创建此文件
--  * 2016.7.12 : 更新消费代付订单状态
--
--
-- 脚本返回值说明:
--      true :  指示 Http 服务器响应 200
--      false : 指示 Http 服务器响应 500
--
require 'core.lib'

if not reqt or not reqt.packet then
    logger.error('脚本环境不完整，请检查...')
    return false
end

-- 检查通知报文中要素
local _keys = {
    "txnType", "txnSubType", "bizType", "merId", "orderId", "txnTime", "txnAmt"
}
for _, _key in ipairs(_keys) do
    if not reqt.packet.get(_key) then
        logger.error('ACP 通知报文中缺少字段[{}], 不能处理.', _key)
        return false
    end
end

-- 查询原请求交易流水并更新
-- 这里循环查询 60 次，因为有可能通知到达时，请求流水尚未登记
for i = 1, 60 do
    local _table = jdbc.select([[
        select * from pay_trlist where
            chnl = 3 and incoming = false and
            json_extract_path_text(i_pkt, 'txnType')  = ? and
            json_extract_path_text(i_pkt, 'txnSubType')  = ? and
            json_extract_path_text(i_pkt, 'bizType')  = ? and
            json_extract_path_text(i_pkt, 'merId')  = ? and
            json_extract_path_text(i_pkt, 'orderId')  = ? and
            json_extract_path_text(i_pkt, 'txnTime')  = ? and
            json_extract_path_text(i_pkt, 'txnAmt')  = ?
    ]],
            reqt.packet.get('txnType'),
            reqt.packet.get('txnSubType'),
            reqt.packet.get('bizType'),
            reqt.packet.get('merId'),
            reqt.packet.get('orderId'),
            reqt.packet.get('txnTime'),
            reqt.packet.get('txnAmt'))
    if not _table then
        logger.error('依据通知报文要素查询原交易失败.')
        return false
    end
    if _table.count > 1 then    -- 不应该查询到多条记录
        logger.fatal('依据通知报文要素查询到多笔原交易记录，请检查...')
        return true
    end

    -- 如果查询到原交易流水，则更新记录后停止循环
    if _table.count == 1 then
        local _acp_record = _table.get_record(0) -- 原交易流水记录

        local _rescode = reqt.packet.get('respCode')
        local _resmsg  = reqt.packet.get('respMsg')

        -- 获取原 acp 交易状态
        local _t = jdbc.select([[
            select status from pay_trlist where uuid = ? and uuid_no = ?
        ]], _acp_record.get('uuid'), _acp_record.get('uuid_no'))

        local _tr_status = _t.get_record(0).get('status')

        -- 更新原交易记录流水
        local _notes = string.format('后台通知：%s-%s',
            _rescode or '无响应码', _resmsg  or '无响应消息')
        jdbc.update([[
            update pay_trlist set status = 0, n_pkt = ?, notes = ? where
                uuid = ? and uuid_no = ?
        ]],
            reqt.packet.tojson(), _notes,
            _acp_record.get('uuid'), _acp_record.get('uuid_no')
        )
        logger.info('更新原交易流水通知报文成功...')

        -- 如果原交易与消费代付订单关联，则更新订单状态
        core.acp_aux.update_p1_order (_acp_record.get('uuid'), _rescode)
        core.acp_aux.update_p2_order (_acp_record.get('uuid'), _rescode)
        core.acp_aux.update_t40_recvr(_acp_record.get('uuid'), _rescode, _tr_status)
        return true
    end
    sleep(500)  -- 等待半秒后重试
end

-- 如果循环结束后还未能查询到原交易记录，则给出错误提示
logger.error([[依据通知报文要素未查询到原交易记录，请检查，查询要素为:
    txnType[%s],
    txnSubType[%s],
    bizType[%s],
    merId[%s],
    orderId[%s],
    txnTime[%s],
    txnAmt[%s].
]],
    reqt.packet.get('txnType'),
    reqt.packet.get('txnSubType'),
    reqt.packet.get('bizType'),
    reqt.packet.get('merId'),
    reqt.packet.get('orderId'),
    reqt.packet.get('txnTime'),
    reqt.packet.get('txnAmt'))
return true
